import org.newdawn.slick.*;

/**
 * The interface used for gamemodes.
 * 
 * @author Gerrit Jamerson, CodeMonkeys
 * @version 4/3/13
 */
public interface IGamemode
{
    /**
     * Returns the level controller
     * 
     * @pre None
     * @param None
     * @return The level controller
     * @post None
     */
    public abstract ILevelController getLevelController();

    /**
     * Initializes the gamemode. This is where necessary objects should be instantiated.
     * 
     * @pre None
     * @param None
     * @return Void
     */
    public abstract void initialize();
    
    /**
     * Called each frame. Used to draw the layer.
     * 
     * @pre None
     * @param gameContainer The gameContainer
     * @param graphics The Graphics class
     * @return void
     * @post The layer is drawn onto the screen, if needed
     */
    public abstract void render(GameContainer gameContainer, Graphics graphics);

    /**
     * Called each step. Used to update the layer.
     * 
     * @pre None
     * @param gameContainer The gameContainer
     * @param intDelta The delta time between updates
     * @return void
     * @post The layer is drawn onto the screen, if needed
     */
    public abstract void update(GameContainer gameContainer, int intDelta);
    
    /**
     * Called when a key is pressed.
     * 
     * @pre None
     * @param key The key that was pressed.
     * @return void
     * @post None
     */
    public abstract void keyPressed(Keys key);
    
    /**
     * Called when a key is pressed.
     * 
     * @pre None
     * @param key The key that was released.
     * @return void
     * @post None
     */
    public abstract void keyReleased(Keys key);
} //End interface
